package com.qfedu.utils;

/**
 * @author:zhengyilong
 * @email:1797344574@qq.com
 * @phone:13479394730
 * @desc:该类用于将字节数组转换成16进制字符串，配合哈希算法使用
 * @DateTime:2022/5/14 10:58
 **/

public class ByteArrToHexString {

    public static String getByteArrToHexString(byte[] bytes){
        if (bytes == null){
            return null;
        }
        //声明一个空可变字符串，用于存放十六机制字符串
        StringBuffer stringBuffer = new StringBuffer();
        //声明一个变量，用于临时存放一个字节的十六进制字符串
        String temp = null;
        for (int i=0;i<bytes.length;i++){
                /*
                toHexString() 把一个int转换为十六进制String
                & 0xFF的作用是保证byte类型转int后其二进制的一致
                byte类型是8位，而int是32位，转换时需在前面补码
                如原先byte类型为正数则补码24个0，并不影响二进制的一致
                而如果原先byte类型为负数则补码24个1，会影响二进制的一致
                & 0xFF的作用便是保证如果byte类型为负数时转换成int补码为24个0
                 */
            temp = Integer.toHexString(bytes[i] & 0xFF);
                /*
                一个byte字节是八位
                如果其十进制值大于16得到两个8进制
                如果等于小于16则得到一个8进制
                此时我们需要在前面补0
                在此我们直接将0补在stringBuffer后面
                 */
            if (temp.length()==1){
                stringBuffer.append("0");
            }
            //将临时存放一个字节的十六进制字符串追加到stringBuffer后面
            stringBuffer.append(temp);
        }
        //将stringBuffer类型转换成string类型返回
        return stringBuffer.toString();
    }

}

